#ifndef _ARBRE
#define _ARBRE

#include "element.h" 


struct sNoeud {
  Elem info;
  struct sNoeud * fg;
  struct sNoeud * fd;
};
typedef struct sNoeud Noeud;


struct sArbre {
  Noeud * adRacine; 
  int nbElemDansArbre;
};
typedef struct sArbre Arbre;


void initialiserArbre(Arbre * pA);
/* Precondition : *pA non prealablement initialise
   Postcondition : *pA est initialise vide */


void testamentArbre(Arbre *pA);
/* Precondition : *pA prealablement initialise
   Postcondition : *pA pret a disparaitre (ne doit plus etre utilise) */


void affecterArbre(Arbre *pA, Arbre B);
/* Precondition : *pA et B prealablement initialises 
   Postcondition : *pA et B correspondent a des arbres identiques
   (mais ils sont totalement independants l'un de l'autre)
   (*pA est une copie de B) */


int testArbreVide(Arbre A);
/* Precondition : A initialise
   Resultat : 1 si A est vide, 0 sinon */


void affichageArbre(Arbre A);
/* Precondition : A initialise
   Postcondition : Affichage de tous les elements de A par  y croissant */


void viderArbre(Arbre *pA);
/* Precondition : A initialise 
   Postcondition : A est vide */


void insererElement(Elem e, Arbre *pA);
/* Precondition : *pA est un arbre binaire de recherche initialise
   Postcondition : un nouveau noeud contenant e est insere a sa place
   aux feuilles de *pA, en respectant la relation d'ordre sur les 
   coordonnees y des elements stockes dans l'arbre. */



void supprimerElement(Elem e, Arbre * pA, int * trouve);
/* Precondition : A initialise
   Postcondition : si aucun noeud de l'arbre *pA ne contient l'element e passee
   en parametre, l'entier *trouve vaut 0. Si au contraire on a trouve un
   noeud avec exactement le e demande, alors *trouve vaut 1 et le noeud est 
   supprime (en faisant attention de preserver la relation d'ordre sur y). */


#endif
